#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
简化的启动脚本 - 仅启动API服务器
用于验证API服务器功能
"""

import os
import sys
import logging
import time

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("api_only.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger('api_only_startup')

# 添加请求日志中间件
def log_requests():
    def decorator(app):
        @app.before_request
        def before_request():
            from flask import request
            logger.debug(f"请求: {request.method} {request.url} 来自 {request.remote_addr}")
            logger.debug(f"请求路径: {request.path}")
            logger.debug(f"请求头: {dict(request.headers)}")
            logger.debug(f"查询参数: {request.args}")
            
        @app.after_request
        def after_request(response):
            from flask import request
            logger.debug(f"响应: {response.status_code} {request.method} {request.url}")
            logger.debug(f"响应头: {dict(response.headers)}")
            return response
            
        @app.teardown_request
        def teardown_request(exception):
            if exception:
                logger.error(f"请求处理异常: {exception}")
                
        return app
    return decorator

# 添加自定义URL映射日志
def log_url_mapping(app):
    """打印所有URL映射的详细信息"""
    logger.debug("===== URL映射详细信息 =====")
    for rule in app.url_map.iter_rules():
        logger.debug(f"规则: {rule}")
        logger.debug(f"  端点: {rule.endpoint}")
        logger.debug(f"  方法: {list(rule.methods)}")
        logger.debug(f"  参数: {list(rule.arguments)}")
        logger.debug(f"  构建器: {rule.build({}) if not rule.arguments else '需要参数'}")
    logger.debug("============================")

# 添加Flask配置检查
def check_flask_config(app):
    """检查Flask配置"""
    logger.debug("===== Flask配置检查 =====")
    logger.debug(f"DEBUG: {app.config.get('DEBUG')}")
    logger.debug(f"TESTING: {app.config.get('TESTING')}")
    logger.debug(f"PREFERRED_URL_SCHEME: {app.config.get('PREFERRED_URL_SCHEME')}")
    logger.debug(f"SERVER_NAME: {app.config.get('SERVER_NAME')}")
    logger.debug(f"APPLICATION_ROOT: {app.config.get('APPLICATION_ROOT')}")
    logger.debug(f"MAX_CONTENT_LENGTH: {app.config.get('MAX_CONTENT_LENGTH')}")
    logger.debug("==========================")

def main():
    """主函数 - 仅启动API服务器"""
    logger.info("开始启动API服务器（独立模式）...")
    
    try:
        # 导入必要的模块
        logger.info("导入相关模块...")
        import os
        from flask import Flask
        
        # 设置调试模式
        env_debug = os.environ.get('FLASK_DEBUG', '1')  # 默认开启调试
        os.environ['FLASK_DEBUG'] = env_debug
        logger.info(f"设置调试模式: {env_debug}")
        
        # 导入API服务器类并创建实例
        logger.info("导入API服务器模块...")
        from api.api_server import ApiServer
        
        # 创建新的API服务器实例
        logger.info("创建新的API服务器实例...")
        api_server = ApiServer()
        
        # 强制使用127.0.0.1作为主机和指定端口
        api_server.host = '127.0.0.1'
        api_server.port = 5001  # 更改端口以避免冲突
        
        # 应用请求日志中间件
        logger.info("应用请求日志中间件...")
        log_requests()(api_server.app)
        
        # 检查Flask配置
        check_flask_config(api_server.app)
        
        # 应用代理修复中间件（如果需要通过代理访问）
        from werkzeug.middleware.proxy_fix import ProxyFix
        api_server.app.wsgi_app = ProxyFix(api_server.app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)
        
        # 打印所有注册的路由，用于调试
        logger.info("注册的路由:")
        print("\n=== 注册的路由详情 ===")
        for rule in api_server.app.url_map.iter_rules():
            methods = ', '.join(sorted(rule.methods))
            logger.info(f"{rule.endpoint}: {rule} [{methods}]")
            print(f"{rule.endpoint}: {rule} [{methods}]")
        
        # 打印详细的URL映射信息，用于深入调试
        log_url_mapping(api_server.app)
        
        logger.info("正在启动API服务器...")
        print(f"\n直接在前台运行Flask应用，主机: {api_server.host}, 端口: {api_server.port}, 调试: {env_debug}")
        print(f"访问 http://{api_server.host}:{api_server.port}/api/health 进行健康检查")
        logger.info(f"注意：5000端口可能被其他服务占用，现在使用{api_server.port}端口")
        
        # 直接运行Flask应用，这样可以看到完整的错误信息
        api_server.app.run(
            host=api_server.host,
            port=api_server.port,
            debug=(env_debug == '1'),
            use_reloader=False,
            threaded=True
        )
        
        return 0
            
    except Exception as e:
        logger.error(f"启动过程中出错: {str(e)}")
        print(f"错误: {str(e)}")
        import traceback
        logger.error(f"详细错误堆栈: {traceback.format_exc()}")
        print(f"详细错误堆栈: {traceback.format_exc()}")
        return 1
    
    return 0

if __name__ == "__main__":
    sys.exit(main())